package com.yilizhiyou.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yilizhiyou.dto.UserLoginDTO;
import com.yilizhiyou.dto.UserRegisterDTO;
import com.yilizhiyou.entity.User;

import java.util.Map;

/**
 * 用户服务接口
 * 
 * @author 伊犁智游开发团队
 * @since 1.0.0
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     * 
     * @param registerDTO 注册信息
     * @return 注册结果
     */
    Map<String, Object> register(UserRegisterDTO registerDTO);

    /**
     * 用户登录
     * 
     * @param loginDTO 登录信息
     * @return 登录结果
     */
    Map<String, Object> login(UserLoginDTO loginDTO);

    /**
     * 用户退出登录
     * 
     * @param token 用户token
     * @return 退出结果
     */
    boolean logout(String token);

    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名
     * @return 用户信息
     */
    User findByUsername(String username);

    /**
     * 根据手机号查询用户
     * 
     * @param phone 手机号
     * @return 用户信息
     */
    User findByPhone(String phone);

    /**
     * 根据邮箱查询用户
     * 
     * @param email 邮箱
     * @return 用户信息
     */
    User findByEmail(String email);

    /**
     * 更新用户信息
     * 
     * @param user 用户信息
     * @return 更新结果
     */
    boolean updateUserInfo(User user);

    /**
     * 修改密码
     * 
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 修改结果
     */
    boolean changePassword(Long userId, String oldPassword, String newPassword);

    /**
     * 重置密码
     * 
     * @param phone 手机号
     * @param newPassword 新密码
     * @param smsCode 短信验证码
     * @return 重置结果
     */
    boolean resetPassword(String phone, String newPassword, String smsCode);

    /**
     * 发送短信验证码
     * 
     * @param phone 手机号
     * @param type 验证码类型（register, reset, login）
     * @return 发送结果
     */
    boolean sendSmsCode(String phone, String type);

    /**
     * 验证短信验证码
     * 
     * @param phone 手机号
     * @param code 验证码
     * @param type 验证码类型
     * @return 验证结果
     */
    boolean verifySmsCode(String phone, String code, String type);
}
